package com.zyy.java8.samples.stream;

import java.util.*;

/**
 * @author zhangyiying
 * @ClassName: Stream1
 * @Description:
 * @date 2021/12/27 15:12
 */
public class Streams1 {

    public static void main(String[] args) {
        List<String> stringCollection = new ArrayList<>();
        stringCollection.add("ddd2");
        stringCollection.add("aaa2");
        stringCollection.add("bbb1");
        stringCollection.add("aaa1");
        stringCollection.add("bbb3");
        stringCollection.add("ccc");
        stringCollection.add("bbb2");
        stringCollection.add("ddd1");

        // filtering
        stringCollection
                .stream()
                .filter(s -> s.startsWith("a"))
                .forEach(System.out::println);
        // "aaa2", "aaa1"

        // sorting
        stringCollection
                .stream()
                .sorted()
                .filter(s -> s.startsWith("a"))
                .forEach(System.out::println);
        // "aaa1", "aaa2"

        // mapping
        stringCollection
                .stream()
                .map(String::toUpperCase)
//                .sorted((a, b) -> b.compareTo(a))
                .sorted(Comparator.reverseOrder())
                .forEach(System.out::println);
        // "DDD2", "DDD1", "CCC", "BBB3", "BBB2", "AAA2", "AAA1"


        // matching
        boolean anyStartsWithA  = stringCollection
                .stream()
                .anyMatch(s -> s.startsWith("a"));
        // true
        System.out.println(anyStartsWithA);

        boolean allStartWithA = stringCollection
                .stream()
                .allMatch(s -> s.startsWith("aaa"));
        // false
        System.out.println(allStartWithA);

        boolean noneStartsWithZ  = stringCollection
                .stream()
                .noneMatch(s -> s.startsWith("z"));
        // true
        System.out.println(noneStartsWithZ);


        // counting
        long startsWithB  = stringCollection
                .stream()
                .filter(s -> s.startsWith("b"))
                .count();
        // 3
        System.out.println(startsWithB);


        //reducing reduce:(T identity,BinaryOperator)/reduce(BinaryOperator)-可以将流中元素反复结合起来，得到一个值
        Optional<String> reduced = stringCollection
                .stream()
                .sorted()
                .reduce((s1, s2) -> s1 + "#" + s2);
        // "aaa1#aaa2#bbb1#bbb2#bbb3#ccc#ddd1#ddd2"
        reduced.ifPresent(System.out::println);

    }
}
